package com.kai.kaiMybatis.sqlsession;

import com.kai.entity.Monster;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author kai
 * @version 1.0
 * @date 2024/7/30
 * @Description
 */
public class kaiExecutor  implements Executor{
    kaiConfiguration kaicon = new kaiConfiguration();

    /**
     * 根据sql查询
     * @param sql
     * @param parameter
     * @return
     * @param <T>
     */
    @Override
    public <T> T query(String sql, Object parameter) {



        //得到连接Connection
       Connection connection=getConnection();

       //查询返回结果集
        ResultSet preset = null;
        PreparedStatement pre = null;

        try {
            pre = connection.prepareStatement(sql);
            //设置参数，如果参数多，可以用数组处理
            //给PreparedStatement设置参数。PreparedStatement允许你在SQL语句中使用预编译的占位符（通常是问号?）
            pre.setString(1,parameter.toString());//参数1表示这是第一个（也是唯一一个，在这个例子中）参数占位符的位置。
            preset = pre.executeQuery();
            //把set数据封装到对象-monster
            // 此处简化处理
            //完整是一套反射机制
            Monster monster = new Monster();
            while (preset.next()) {

                monster.setId(preset.getInt("id"));
                monster.setName(preset.getString("name"));
                monster.setAge(preset.getInt("age"));
                monster.setGender(preset.getInt("age"));
                monster.setEmail(preset.getString("email"));
                monster.setBirthday(preset.getDate("birthday"));
                monster.setSalary(preset.getInt("salary"));
            }

            return (T) monster;

        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
            try {
                if (preset != null){
                    preset.close();
                }
                if (pre != null) {
                    pre.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }


        }


    }

    private Connection getConnection() {

        Connection connection = kaicon.build("kai_mybatis.xml");

        return connection;
    }



}
